import {getBaseURL, getSystemId, getSystemName} from "@/config/common.js";

// 第一个请求的公共参数
export const headerConfig = {
    headers: {
        // 白名单设置
        appid: "a588bd9d01ecc75dbbaaefce",
    },
};

/**
 * 这里是设置公共头部参数信息
 * @param {*} options
 * @returns
 */
export function useGetFetchOptions(options = {}) {
    options.baseURL = options.baseURL ?? getBaseURL();
    options.headers = options.headers ?? {
        appid: headerConfig.headers.appid,
        systemid: getSystemId,
        systemName: getSystemName
    };

    const userStore = useStore.userState()
    const token = userStore.token
    options.initialCache = options.initialCache ?? false;
    options.cache = 'no-cache'
    options.key = getUUID()
    options.lazy = options.lazy ?? false;
    if (token) {
        // 用户登录的情况下就获取token写入头部信息。如果没有登录就不写入
        options.headers.token = token;
    }
    // 禁止响应式 --  options.isupload: true代表是文件上传，不需要调用禁止响应式的处理
    if (options.body && !options.isupload) {
        const rawBody = toRaw(options.body);
        options.body = typeof rawBody === "object" ? {...rawBody} : rawBody;
    }

    return options;
}

/**
 * 处理异步请求的方法
 * @param {*} key
 * @param {*} url
 * @param {*} options
 * @returns
 */
export async function useHttp(url, options = {}) {
    options = useGetFetchOptions(options);
    // 用一个延迟阻塞的方式解决问题，
    await nextTick();
    // 这里就是真正请求发起的地方--------------------------重点
    //$fetch---缓存功能--如果你url没有变化，那么是直接从浏览器缓存中去获取 url----data
    let res = await useFetch(url, {
        ...options,
        // 相当于响应拦截器
        transform: (res) => {
            return res;
        },
    });

    if (res.data.value.type == 'application/vnd.ms-excel') {
        return Promise.resolve(res.data.value)
    }

// 客户端错误处理
    if (process.client && res.error.value) {
        const msg = res.error.value?.data?.data;
        const statusCode = res.error.value.statusCode
        if (!options.lazy && statusCode == 500) {
            useMessage().error(msg || "服务端错误");
        }

        if (!options.lazy && statusCode == 404) {
            useMessage().error(msg || "请求资源不存在");
        }
    }

    if (typeof res.data.value === "string") {
        res.data.value = JSON.parse(res.data.value)
    }

// 拦截器错误处理
    if (res.data.value.code === 40006) {
        const userStore = useStore.userState()
        // 提示错误信息
        useMessage().error(res.data.value.msg)
        // 获取状态管理
        // 清空前端的token------为什么？
        userStore.clearUserInfo()
        // 跳转登录
        navigateTo("/login", {replace: true})
        return;
    }

// 权限拦截
    if (res.data.value.code === 401111) {
        useMessage().error(res.data.value.msg)
        navigateTo("/nopermission",{redirect:true})
        return Promise.reject(res.data.value)
    }

// aop权限拦截
    if (res.data.value.code === 90001) {
        useMessage().error(res.data.value.msg)
        return Promise.reject(res.data.value);
    }

// 限流权限拦截
    if (res.data.value.code === 50008) {
        useMessage().error(res.data.value.msg)
        return Promise.reject(res.data.value);
    }

// 开始续期
    if (res.data.value.code === 40066) {
        userStore.setUserInfo(res.data.value.data)
    }

    return res.data.value.code === 20000 ? Promise.resolve(res.data.value) : Promise.reject(res.data.value);
}

/**
 * GET请求
 * @param {*} url  请求业务
 * @param {*} options 请求的参数
 * @returns
 */
export function useHttpGet(url, options = {}) {
    options.method = "GET"
    options.isupload = false
    return useHttp(url, options)
}

/**
 * POST请求
 * @param {*} url  请求业务
 * @param {*} options 请求的参数和头部信息
 * @returns
 */
export function useHttpPost(url, options = {}) {
    options.method = "POST"
    options.isupload = false
    return useHttp(url, options)
}

/**
 * POST请求--文件上传
 * @param {*} url  请求业务
 * @param {*} options 请求的参数和头部信息
 * @returns
 */
export function useHttpUpload(url, options = {}) {
    options.method = "POST"
    options.isupload = true
    return useHttp(url, options)
}
